{% macro deadLoopText(data = { hookName: 'afterUpdate', objectName: 'request.object', createWithoutDataMethod: 'AV.Object.createWithoutData()', disableBeforeHook: 'object.disableBeforeHook()', disableAfterHook: 'object.disableAfterHook()' }) -%}
#### 防止死循环调用

在实际使用中有这样一种场景：在 `Post` 类的 `{{data.hookName}}` Hook 函数中，对传入的 `Post` 对象做了修改并且保存，而这个保存动作又会再次触发 `{{data.hookName}}`，由此形成死循环。针对这种情况，我们为所有 Hook 函数传入的 `{{data.objectName}}` 对象做了处理，以阻止死循环调用的产生。

不过请注意，以下情况还需要开发者自行处理：

- 对传入的 `{{data.objectName}}` 对象进行 `fetch` 操作。
- 重新构造传入的 `{{data.objectName}}` 对象，如使用 `{{data.createWithoutDataMethod}}` 方法。

对于使用上述方式产生的对象，请根据需要自行调用以下 API：

- `{{data.disableBeforeHook}}` 或
- `{{data.disableAfterHook}}`

这样，对象的保存或删除动作就不会再次触发相关的 Hook 函数。
{%- endmacro %}

{% macro numberOfTimers(heading = "### 定时器数量") -%}
{{ heading }}

生产环境和预备环境的定时器数量都限制在 6 个以内，也就是说你总共最多可以创建 12 个定时器。
{%- endmacro %}

{% macro cloudFuncLimitationOnNonPrimaryGroup() -%}
调用非主要组上的云函数不会触发 hook 函数，同时，非主要组也不支持通过 SDK 来调用云函数。
{%- endmacro %}

{% macro leancacheWithCli() -%}
在一个已经关联过 LeanCache 实例的云引擎项目中，使用 `lean cache` 命令，即可连上对应的 LeanCache 实例。另外需要注意的是，每个 LeanCache 实例，默认会分成 16 个 db，方便管理。没有特殊设置的话，默认使用的都是 db0。

连接成功之后，可以直接执行命令来对数据进行操作，比如查看某个 key 的值：

```
LeanCache (db 0) > GET foo
"bar"
```

LeanCache 基于 Redis，所以大部分 Redis 命令都可以使用。关于 Redis 的命令，请参考官方文档：https://redis.io/commands 。

可以通过下列命令查询当前应用有哪些 LeanCache 实例：

``` shell
$ lean cache list
```

**注意**：命令行工具操作 LeanCache 时，是通过 HTTPS 请求来进行通讯的，因此类似 `pub/sub`、`blpop` 等需要长连接的命令不能直接使用。但是线上没有这个限制，可以直接使用。
{%- endmacro %}
